Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TransformTool : Use standardised selection logic #3932

Merged

Conversation

themissingcow
Copy link
Contributor

When we built the SceneViewInspector, we came up with a slightly adjusted set of rule for how editing tools should work with EditScopes and existing nodes. We did however, completely forget to go back and update TransformTool::Selection to match the revised logic.

This PR hopefully makes the transform tools, and inspector behave consistently. The main changes are

  • Existing nodes inside an EditScope will be used in preference to defining a new edit/TransformEdit node.
  • Read-only is now respected for EditScopes, preventing new edits being made in locked scopes.
  • Tool messaging is generally improved to help diagnose the cause of uneditable selections.

This code is a somewhat subtle beast, and so this could do with a good bit of real-life testing.

@themissingcow themissingcow self-assigned this Oct 2, 2020
@themissingcow themissingcow changed the title Transform tool selection tweaks TransformTool : Use standardised selection logic and improve messaging Oct 2, 2020
@themissingcow themissingcow changed the title TransformTool : Use standardised selection logic and improve messaging TransformTool : Use standardised selection logic Oct 2, 2020
Copy link
Member

@johnhaddon johnhaddon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Tom. I had a play with this and it seems to do what it says on the tin with respect to nodes manually added inside the scope. I think I found a regression in another case though. In the script below, if you view Outer and choose it as your scope as well, and then try to edit the cube with the TranslateTool, it says "The target EditScope is not in the scene history" and you can't edit. That seems to work fine in 0.58.2.0.

Script
import Gaffer
import GafferScene
import IECore
import imath

Gaffer.Metadata.registerValue( parent, "serialiser:milestoneVersion", 0, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:majorVersion", 58, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:minorVersion", 3, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 2, persistent=False )

__children = {}

__children["Outer"] = Gaffer.EditScope( "Outer" )
parent.addChild( __children["Outer"] )
__children["Outer"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( Gaffer.EditScope( "Inner" ) )
__children["Outer"]["Inner"].addChild( Gaffer.BoxIn( "BoxIn" ) )
__children["Outer"]["Inner"]["BoxIn"].setup( GafferScene.ScenePlug( "out", ) )
__children["Outer"]["Inner"]["BoxIn"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( GafferScene.ScenePlug( "in", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( Gaffer.BoxOut( "BoxOut" ) )
__children["Outer"]["Inner"]["BoxOut"].setup( GafferScene.ScenePlug( "in", ) )
__children["Outer"]["Inner"]["BoxOut"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( GafferScene.ScenePlug( "out", direction = Gaffer.Plug.Direction.Out, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( Gaffer.BoolPlug( "enabled", defaultValue = True, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( GafferScene.SceneProcessor( "TransformEdits" ) )
__children["Outer"]["Inner"]["TransformEdits"].addChild( Gaffer.Spreadsheet( "Spreadsheet" ) )
__children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "translate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "rotate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "scale", defaultValue = imath.V3f( 1, 1, 1 ), ) )
__children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "pivot", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["Inner"]["TransformEdits"].addChild( GafferScene.PathFilter( "PathFilter" ) )
__children["Outer"]["Inner"]["TransformEdits"].addChild( GafferScene.Transform( "Transform" ) )
__children["Outer"]["Inner"]["TransformEdits"].addChild( Gaffer.Spreadsheet.RowsPlug( "edits", ) )
__children["Outer"]["Inner"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "translate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["Inner"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "rotate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["Inner"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "scale", defaultValue = imath.V3f( 1, 1, 1 ), ) )
__children["Outer"]["Inner"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "pivot", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["Inner"]["TransformEdits"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( GafferScene.Parent( "Parent" ) )
__children["Outer"]["Inner"]["Parent"]["children"].addChild( GafferScene.ScenePlug( "child1", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"]["Parent"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["Inner"].addChild( GafferScene.Cube( "Cube" ) )
__children["Outer"]["Inner"]["Cube"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( Gaffer.BoxIn( "BoxIn" ) )
__children["Outer"]["BoxIn"].setup( GafferScene.ScenePlug( "out", ) )
__children["Outer"]["BoxIn"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( GafferScene.ScenePlug( "in", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( Gaffer.BoxOut( "BoxOut" ) )
__children["Outer"]["BoxOut"].setup( GafferScene.ScenePlug( "in", ) )
__children["Outer"]["BoxOut"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( GafferScene.ScenePlug( "out", direction = Gaffer.Plug.Direction.Out, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( Gaffer.BoolPlug( "enabled", defaultValue = True, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"].addChild( GafferScene.SceneProcessor( "TransformEdits" ) )
__children["Outer"]["TransformEdits"].addChild( Gaffer.Spreadsheet( "Spreadsheet" ) )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "translate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "rotate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "scale", defaultValue = imath.V3f( 1, 1, 1 ), ) )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.V3fPlug( "pivot", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["rows"].addRows( 1 )
__children["Outer"]["TransformEdits"].addChild( GafferScene.PathFilter( "PathFilter" ) )
__children["Outer"]["TransformEdits"].addChild( GafferScene.Transform( "Transform" ) )
__children["Outer"]["TransformEdits"].addChild( Gaffer.Spreadsheet.RowsPlug( "edits", ) )
__children["Outer"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "translate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "rotate", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "scale", defaultValue = imath.V3f( 1, 1, 1 ), ) )
__children["Outer"]["TransformEdits"]["edits"].addColumn( Gaffer.V3fPlug( "pivot", defaultValue = imath.V3f( 0, 0, 0 ), ) )
__children["Outer"]["TransformEdits"]["edits"].addRows( 1 )
__children["Outer"]["TransformEdits"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Sphere"] = GafferScene.Sphere( "Sphere" )
parent.addChild( __children["Sphere"] )
__children["Sphere"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outer"]["__uiPosition"].setValue( imath.V2f( 0.67161417, 0.0499999821 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"], 'readOnly', False )
__children["Outer"]["Inner"]["BoxIn"]["__in"].setInput( __children["Outer"]["Inner"]["in"] )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["BoxIn"]["__in"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["BoxIn"]["__in"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["BoxIn"]["__in"], 'description', 'The output scene.' )
__children["Outer"]["Inner"]["BoxIn"]["__uiPosition"].setValue( imath.V2f( 0.500503898, 8.5 ) )
__children["Outer"]["Inner"]["in"].setInput( __children["Outer"]["BoxIn"]["out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["in"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["in"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["in"], 'description', 'The output scene.' )
__children["Outer"]["Inner"]["BoxOut"]["in"].setInput( __children["Outer"]["Inner"]["Parent"]["out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["BoxOut"]["__out"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["BoxOut"]["__out"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["BoxOut"]["__out"], 'description', 'The output scene.' )
__children["Outer"]["Inner"]["BoxOut"]["passThrough"].setInput( __children["Outer"]["Inner"]["BoxIn"]["out"] )
__children["Outer"]["Inner"]["BoxOut"]["enabled"].setInput( __children["Outer"]["Inner"]["enabled"] )
__children["Outer"]["Inner"]["BoxOut"]["__uiPosition"].setValue( imath.V2f( 0.500503898, -12.9000006 ) )
__children["Outer"]["Inner"]["out"].setInput( __children["Outer"]["Inner"]["BoxOut"]["__out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["out"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["out"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["out"], 'description', 'The output scene.' )
__children["Outer"]["Inner"]["__uiPosition"].setValue( imath.V2f( -18.9000015, -2.53203106 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"], 'editScope:processorType', 'TransformEdits' )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"], 'icon', 'editScopeProcessorNode.png' )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"], 'nodeGadget:color', imath.Color3f( 0.187600002, 0.390799999, 0.600000024 ) )
__children["Outer"]["Inner"]["TransformEdits"]["out"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["Transform"]["out"] )
__children["Outer"]["Inner"]["TransformEdits"]["in"].setInput( __children["Outer"]["Inner"]["BoxIn"]["out"] )
__children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["selector"].setValue( '${scene:path}' )
__children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["rows"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["edits"] )
__children["Outer"]["Inner"]["TransformEdits"]["PathFilter"]["paths"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["activeRowNames"] )
__children["Outer"]["Inner"]["TransformEdits"]["Transform"]["enabled"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["enabled"] )
__children["Outer"]["Inner"]["TransformEdits"]["Transform"]["in"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["in"] )
__children["Outer"]["Inner"]["TransformEdits"]["Transform"]["filter"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["PathFilter"]["out"] )
__children["Outer"]["Inner"]["TransformEdits"]["Transform"]["space"].setValue( 3 )
__children["Outer"]["Inner"]["TransformEdits"]["Transform"]["transform"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["Spreadsheet"]["out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"]["edits"], 'spreadsheet:defaultRowVisible', False )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"]["edits"][0], 'spreadsheet:rowNameWidth', 300 )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"]["edits"][0]["cells"]["translate"], 'spreadsheet:columnWidth', 200 )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"]["edits"][0]["cells"]["rotate"], 'spreadsheet:columnWidth', 200 )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"]["edits"][0]["cells"]["scale"], 'spreadsheet:columnWidth', 200 )
Gaffer.Metadata.registerValue( __children["Outer"]["Inner"]["TransformEdits"]["edits"][0]["cells"]["pivot"], 'spreadsheet:columnWidth', 200 )
__children["Outer"]["Inner"]["TransformEdits"]["__uiPosition"].setValue( imath.V2f( -7.6005044, -5.96046448e-08 ) )
__children["Outer"]["Inner"]["Parent"]["in"].setInput( __children["Outer"]["Inner"]["TransformEdits"]["out"] )
__children["Outer"]["Inner"]["Parent"]["parent"].setValue( '/' )
__children["Outer"]["Inner"]["Parent"]["children"][0].setInput( __children["Outer"]["Inner"]["Cube"]["out"] )
__children["Outer"]["Inner"]["Parent"]["__uiPosition"].setValue( imath.V2f( -2.59949708, -6.54999971 ) )
__children["Outer"]["Inner"]["Cube"]["transform"]["translate"].setValue( imath.V3f( -0.121680096, 0.0861412212, 0.287150264 ) )
__children["Outer"]["Inner"]["Cube"]["__uiPosition"].setValue( imath.V2f( 20.1494961, -2.25000072 ) )
__children["Outer"]["BoxIn"]["__in"].setInput( __children["Outer"]["in"] )
Gaffer.Metadata.registerValue( __children["Outer"]["BoxIn"]["__in"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["BoxIn"]["__in"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["BoxIn"]["__in"], 'description', 'The output scene.' )
__children["Outer"]["BoxIn"]["__uiPosition"].setValue( imath.V2f( -3.18547726, 5.96796894 ) )
__children["Outer"]["in"].setInput( __children["Sphere"]["out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["in"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["in"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["in"], 'description', 'The output scene.' )
__children["Outer"]["BoxOut"]["in"].setInput( __children["Outer"]["TransformEdits"]["out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["BoxOut"]["__out"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["BoxOut"]["__out"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["BoxOut"]["__out"], 'description', 'The output scene.' )
__children["Outer"]["BoxOut"]["passThrough"].setInput( __children["Outer"]["BoxIn"]["out"] )
__children["Outer"]["BoxOut"]["enabled"].setInput( __children["Outer"]["enabled"] )
__children["Outer"]["BoxOut"]["__uiPosition"].setValue( imath.V2f( -4.68547726, -20.9799976 ) )
__children["Outer"]["out"].setInput( __children["Outer"]["BoxOut"]["__out"] )
Gaffer.Metadata.registerValue( __children["Outer"]["out"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["out"], 'nodule:type', 'GafferUI::StandardNodule' )
Gaffer.Metadata.registerValue( __children["Outer"]["out"], 'description', 'The output scene.' )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"], 'editScope:processorType', 'TransformEdits' )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"], 'icon', 'editScopeProcessorNode.png' )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"], 'nodeGadget:color', imath.Color3f( 0.187600002, 0.390799999, 0.600000024 ) )
__children["Outer"]["TransformEdits"]["out"].setInput( __children["Outer"]["TransformEdits"]["Transform"]["out"] )
__children["Outer"]["TransformEdits"]["in"].setInput( __children["Outer"]["Inner"]["out"] )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["selector"].setValue( '${scene:path}' )
__children["Outer"]["TransformEdits"]["Spreadsheet"]["rows"].setInput( __children["Outer"]["TransformEdits"]["edits"] )
__children["Outer"]["TransformEdits"]["PathFilter"]["paths"].setInput( __children["Outer"]["TransformEdits"]["Spreadsheet"]["activeRowNames"] )
__children["Outer"]["TransformEdits"]["Transform"]["enabled"].setInput( __children["Outer"]["TransformEdits"]["enabled"] )
__children["Outer"]["TransformEdits"]["Transform"]["in"].setInput( __children["Outer"]["TransformEdits"]["in"] )
__children["Outer"]["TransformEdits"]["Transform"]["filter"].setInput( __children["Outer"]["TransformEdits"]["PathFilter"]["out"] )
__children["Outer"]["TransformEdits"]["Transform"]["space"].setValue( 3 )
__children["Outer"]["TransformEdits"]["Transform"]["transform"].setInput( __children["Outer"]["TransformEdits"]["Spreadsheet"]["out"] )
__children["Outer"]["TransformEdits"]["edits"][1]["name"].setValue( '/sphere' )
__children["Outer"]["TransformEdits"]["edits"][1]["cells"]["translate"]["value"].setValue( imath.V3f( 0.11235854, -0.269507796, 4.54280138 ) )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"]["edits"], 'spreadsheet:defaultRowVisible', False )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"]["edits"][0], 'spreadsheet:rowNameWidth', 300 )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"]["edits"][0]["cells"]["translate"], 'spreadsheet:columnWidth', 200 )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"]["edits"][0]["cells"]["rotate"], 'spreadsheet:columnWidth', 200 )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"]["edits"][0]["cells"]["scale"], 'spreadsheet:columnWidth', 200 )
Gaffer.Metadata.registerValue( __children["Outer"]["TransformEdits"]["edits"][0]["cells"]["pivot"], 'spreadsheet:columnWidth', 200 )
__children["Outer"]["TransformEdits"]["__uiPosition"].setValue( imath.V2f( -20.4000015, -12.4799976 ) )
__children["Sphere"]["transform"]["translate"].setValue( imath.V3f( -0.200081155, -0.0145621896, 5.67827845 ) )
__children["Sphere"]["__uiPosition"].setValue( imath.V2f( -0.82838583, 10.1500006 ) )


del __children

I still find myself uneasy about the entire concept of allowing direct creation of nodes inside EditScopes by users. For me, part of the beauty of the original concept was that they provided a "safe space" for Gaffer to manage automatically created nodes. I worry that the increased complexity and potential for endless edge cases outweighs any perceived benefit from allowing direct editing by users.

python/GafferSceneUITest/TransformToolTest.py Show resolved Hide resolved
src/GafferSceneUI/TransformTool.cpp Outdated Show resolved Hide resolved
src/GafferSceneUI/TransformTool.cpp Outdated Show resolved Hide resolved
src/GafferSceneUI/TransformTool.cpp Outdated Show resolved Hide resolved
src/GafferSceneUI/TransformTool.cpp Show resolved Hide resolved
src/GafferSceneUI/TransformTool.cpp Outdated Show resolved Hide resolved
src/GafferSceneUI/TransformTool.cpp Outdated Show resolved Hide resolved
@themissingcow
Copy link
Contributor Author

@johnhaddon Added ' to " commits here and here.

@themissingcow
Copy link
Contributor Author

I think I found a regression in another case though. In the script below, if you view Outer and choose it as your scope as well, and then try to edit the cube with the TranslateTool, it says "The target EditScope is not in the scene history" and you can't edit. That seems to work fine in 0.58.2.0.

Fixed here. Thanks for the catch. I think we still don't officially 'support' nested EditScopes, but I think we hopefully have them working if they become required.

We were inconsistent with the standardised logic established whilst working
on the `SceneViewInspector`. We picked EditScopes in preference over any
applicable nodes inside the scope. This could result in unnecessary
`TranformEdits` being made, even if the the target location's source node
was inside the scope, or there was an existing Transform node editing
that location.
Provides more detail, and matches the language used in the
`SceneViewInspector`.
…dits

Though the tool correctly handled readOnly state for for existing plugs,
it was still possible to inadvertently insert rows into `TransformEdits`,
even if the `edits` plug was locked (inherited or otherwise).
@johnhaddon johnhaddon changed the base branch from 0.58_maintenance to master December 3, 2020 12:55
Copy link
Member

@johnhaddon johnhaddon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did some further testing with this and all seems well. Rebased onto master ready for release in 0.59. Sorry for the delay in getting to this one Tom...

@themissingcow
Copy link
Contributor Author

Did some further testing with this and all seems well. Rebased onto master ready for release in 0.59. Sorry for the delay in getting to this one Tom...

No probs :) thanks for sorting the rebase.

@johnhaddon johnhaddon merged commit a99f05a into GafferHQ:master Dec 3, 2020
@themissingcow themissingcow deleted the transformToolSelectionTweaks branch December 17, 2020 09:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

3 participants